package com.hnit.applet.common.annotation;


import com.hnit.applet.common.enums.LimitType;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * @author zwj
 * @date 2022/7/13
 * @description TODO 接口防刷
 */
@Retention(RUNTIME)
@Target(METHOD)
@Documented
public @interface AccessLimit {

    /**
     * 限流key前缀
     */
    String prefix() default "limit:";

    /**
     * 以第一次请求往后退时间为准
     * 例如第一次请求是在12：00点，请求时间设置一分钟
     * 在12：01分的时间段内访问次数超过count会报错，但是到12：01之后会重新开始计数，而不是以后不可访问
     * 时间段，单位为毫秒，默认值为一分钟
     * 考虑到以上因素，如果知识为了避免攻击，建议把time设置大一点，例如一分钟20次
     * 如果想要避免重复提交问题，需要且只能把Count设置成1，同时time设置小一点 例如一秒一次
     */
    int seconds() default 1;

    /**
     * 允许访问的次数，默认值为max_value
     */
    int maxCount() default Integer.MAX_VALUE;

    /**
     * 限流类型
     */
    LimitType type() default LimitType.DEFAULT;
}
